package com.easysoft.commons.utils;

import java.util.Random;

/**
 * 随机数工具类
 *
 * @author try
 * @version 1.0
 */
public class RandomUtils {

    /**
     * 数字随机数
     */
    private static final char[] NUMBER = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};

    /**
     * 英文字母随机数
     */
    private static final char[] LETTER = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'm', 'n', 'p', 'q',
            'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};

    /**
     * 数字英文字母混合随机数
     */
    private static final char[] NUMBER_LETTER = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd',
            'e', 'f', 'g', 'h', 'i', 'j', 'k', 'm', 'n', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};

    /**
     * 特殊字符加英文字母混合
     * */
    private static final char[] SPECIAL_CHARS = {'~', '!', '@', '$', '%', '^', '^', '&', '*', '(', ')', '_', '-', '+', '=',
            ';', ':', '<', '>', '?', ',', '.'};

    /**
     * 获取随机的数字
     *
     * @param length 长度
     * @return 随机数
     */
    public static String getRandomNumber(int length) {
        return getRandomByChart(length, NUMBER);
    }

    /**
     * 获取随机的英文字母
     *
     * @param length 长度
     * @return 随机数
     */
    public static String getRandomLetter(int length) {
        return getRandomByChart(length, LETTER);
    }

    /**
     * 获取随机的数字英文字母混合
     *
     * @param length 长度
     * @return 随机数
     */
    public static String getRandomNumberAndLetter(int length) {
        return getRandomByChart(length, NUMBER_LETTER);
    }


    /**
     * 获取随机特殊字符的组合
     *
     * @param length 长度
     * @return 随机数
     */
    public static String getSpecialChart(int length) {
        Random random = new Random();
        int flag = random.nextInt(length);
        if (flag==0){
            flag = length/2;
        }
        StringBuilder stringBuilder = new StringBuilder();
        for (int i=0;i<flag;i++){
            stringBuilder.append(NUMBER_LETTER[random.nextInt(NUMBER_LETTER.length)]);
        }
        for (int i=0;i<length-flag;i++){
            stringBuilder.append(SPECIAL_CHARS[random.nextInt(SPECIAL_CHARS.length)]);
        }
        return stringBuilder.toString();
    }


    /**
     * 根据取值范围获取随机长度的字符
     *
     * @param length 长度
     * @param chart  取值范围
     * @return 随机数
     */
    public static String getRandomByChart(int length, char[] chart) {
        Random rand = new Random();
        StringBuffer text = new StringBuffer();
        for (int i = 0; i < length; i++) {
            text.append(chart[rand.nextInt(chart.length)]);
        }
        return text.toString();
    }

    /**
     * 根据当前时间生成22位的日期随机数
     *
     * @return
     */
    public static String getOrderNumber() {
        String currentDate = DateTimeUtils.getCurrentLocal("yyyyMMddHHmmssSSS");
        String randomStr = getRandomNumber(5);
        return StringUtils.append(currentDate, randomStr);
    }
}
